package com.fishing.util;

import java.io.UnsupportedEncodingException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
/***
 * 封装HttpServletRequest参数，支持参数值类型转换
 * @author 田光辉
 *
 */
public class Parameters {
	/** HttpServletRequest对象 **/
	private HttpServletRequest request;
	private String encode ;
    /***
     * Parameters无参构造方法
     */
    public Parameters() {
    	
	}
    /***
     * Parameters构造方法
     * @param request HttpServletRequest对象
     */
	public Parameters(HttpServletRequest request) {
		this.request = request;
	}
    /***
     * Parameters构造方法
     * @param request  HttpServletRequest对象
     * @param encodeUTF8  是否转换进行UTF8编码
     */
	public Parameters(HttpServletRequest request, String encode) {
		this.request = request;
		this.encode = encode;
	}
    

	/***
	 * 根据参数name值取类型为String的参数值
	 * @param key 参数name
	 * @return 参数value
	 */
	public String getString(String key) {
		return this.getParamsMap().get(key)==null?"":this.getParamsMap().get(key).toString();
	}
	
	public Object get(String key){
		return this.getParamsMap().get(key);
	}
    
	/***
	 * 根据参数name值取类型为Integer的参数值
	 * @param key 参数name
	 * @return 参数value
	 */
	public Integer getInteger(String key) {
		if(this.getParamsMap().get(key) == null){
			return null;
		}
		return Integer.parseInt(this.getParamsMap().get(key).toString());
	}
	
	/***
	 * 根据参数name值取类型为int的参数值
	 * @param key 参数name
	 * @return 参数value
	 */
	public int getInt(String key) {
		return this.getInteger(key);
	}
	
	/***
	 * 根据参数name值取类型为double的参数值
	 * @param key 参数name
	 * @return 参数value
	 */
	public double getDouble(String key) {
		return Double.parseDouble(this.getParamsMap().get(key).toString());
	}
	
	/***
	 * 根据参数name值取类型为Float的参数值
	 * @param key 参数name
	 * @return 参数value
	 */
	public double getFloat(String key) {
		return Float.parseFloat(this.getParamsMap().get(key).toString());
	}
	
	/***
	 * 根据参数name值取类型为Timestamp的参数值
	 * @param key 参数name
	 * @return 参数value
	 */
	public Timestamp getTimestamp(String key) {
		return new Timestamp(this.getDateTime(key).getTime());
	}
    
	/***
	 * 根据参数name值取类型为Date的参数值
	 * @param key 参数name
	 * @return 参数value 格式(yyyy-mm-dd)
	 */
	public Date getDate(String key) {
		return this.getDateByself(key, "yyyy-mm-dd");
	}
	
	/***
	 * 根据参数name值取类型为Date的参数值
	 * @param key 参数name
	 * @return 参数value 格式(yyyy-mm-dd HH:mm:ss)
	 */
	public Date getDateTime(String key) {
		return this.getDateByself(key, "yyyy-mm-dd HH:mm:ss");
	}
	
	/***
	 * 根据参数name值按照自己的格式取Date类型的参数值
	 * @param key 参数name
	 * @param format 格式化字符串 如（yyyy-mm-dd HH:mm:ss）
	 * @return 参数value
	 */
	public Date getDateByself(String key,String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Date value = null;
		try {
			value = sdf.parse(this.getString(key));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return value;
	}
	
    /***
     * 判断该参数值是否是空值（null and ""）
     * @param key 参数name值
     * @return boolean true:不为空，false:为空
     */
	public boolean isEmpty(String key) {
		if(this.getRequest().getParameter(key) != null && !"".equals(this.getRequest().getParameter(key))){
			return true;
		}
		return false;
	}
    
	/***
	 * 判断是否有该参数
	 * @param key 参数name值
	 * @return boolean
	 */
	public boolean isExistsParam(String key) {
		return this.getParamsMap().containsKey(key);
	}

	/**
	 * 
	 * @param request
	 * @return 把请求参数名称和值放到Map中
	 */
	public HashMap<String, Object> getParamsMap() {
		return (HashMap<String, Object>)getParamsMap_sereliaze()[0];
	}
	
	public Object [] getParamsMap_sereliaze(){
		Object [] os = new Object [2];
		String seraliazes = "";
		Map<String, Object> map = new HashMap<String, Object>();
		Enumeration en = request.getParameterNames();
		while (en.hasMoreElements()) {
			String name = (String) en.nextElement();
			String value =  request.getParameter(name);
			if(value != null && !"".equals(value) ){
				if(null != this.encode && !"".equals(this.encode)){
					try {
						value = SysUtil.convertToEncode(value,this.encode);
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
				}
			}
			
			map.put(name, value);
			if(!"pageSize".equals(name) && !"currentPage".equals(name)){
				seraliazes += name+"="+value+"&";
			}
			
		}
		seraliazes = seraliazes.indexOf("&")!=-1?seraliazes.substring(0,seraliazes.length()-1):seraliazes;
		os[0] = map;
		os[1] = seraliazes;
		return os;
	}
	
	public boolean valiInArray (String value ,String [] values){
		boolean flag = false;
		if( values != null){
			for (int i = 0; i < values.length; i++) {
				if(value.equals(values[i])){
					flag = true;
					break;
				}
			}
		}
		return flag;
	}
	
	

	public String getSerializes() {
		return (String)getParamsMap_sereliaze()[1];
	}
	
	public HttpServletRequest getRequest() {
		return request;
	}

	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}

	
	public String getEncode() {
		return encode;
	}
	public void setEncode(String encode) {
		this.encode = encode;
	}
	/***
	 * request参数数组值
	 * @param key request参数name值
	 * @return 
	 */
	public String [] getStringValues(String key){
		return this.getRequest().getParameterValues(key);
	}
	/***
	 * 判断当前key对应的参数值跟目标Str是否相同
	 * @param key  request key
	 * @param Str  输入字符串
	 * @return boolean true：相同，false：不相同
	 */
	public boolean equalStr(String key, String Str){
		if(!this.isEmpty(key)){
			if(Str.equals(this.getString(key))){
				return true;
			}
		}
		return false;
	}
	
}
